/**
 * 产品数据访问层 - 支付产品的数据库操作接口
 *
 * 开发人员：陈宏伟
 * 开发时间：2025-10-25 至 2025-10-30
 * 模块职责：定义支付产品的数据库查询方法，支持多租户产品管理和分类查询
 *
 * 技术要点：
 * - Spring Data JPA查询方法定义
 * - 多租户数据隔离查询设计
 * - 产品状态和分类管理查询支持
 * - 模糊搜索和排序查询优化
 * - 自定义JPQL查询处理复杂业务逻辑
 *
 * 开发故事：负责产品Repository的设计和实现，与支付服务层深度配合，提供高效的产品数据访问能力和产品管理支持。
 */
package com.pbl.repository;

import com.pbl.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface ProductRepository extends JpaRepository<Product, Long> {
    
    /**
     * 根据企业ID查询所有产品
     */
    List<Product> findByEnterprise_IdOrderBySortOrderAsc(Long enterpriseId);
    
    /**
     * 根据企业ID和状态查询产品
     */
    List<Product> findByEnterprise_IdAndStatusOrderBySortOrderAsc(Long enterpriseId, Product.ProductStatus status);
    
    /**
     * 根据企业ID和产品代码查询产品
     */
    Optional<Product> findByEnterprise_IdAndCode(Long enterpriseId, String code);
    
    /**
     * 根据企业ID和产品名称模糊查询
     */
    @Query("SELECT p FROM Product p WHERE p.enterprise.id = :enterpriseId AND p.status = 'ACTIVE' AND p.name LIKE %:keyword% ORDER BY p.sortOrder ASC")
    List<Product> findByEnterpriseIdAndNameContaining(@Param("enterpriseId") Long enterpriseId, @Param("keyword") String keyword);
    
    /**
     * 根据企业ID和分类查询产品
     */
    List<Product> findByEnterprise_IdAndCategoryAndStatusOrderBySortOrderAsc(Long enterpriseId, String category, Product.ProductStatus status);
    
    /**
     * 企业产品列表
     */
    List<Product> findByEnterpriseId(Long enterpriseId);
    
    /**
     * 企业指定状态产品列表
     */
    List<Product> findByEnterpriseIdAndStatus(Long enterpriseId, String status);
}
